xentrace: reduce trace buffer size to something mfn_offset can reach
authorOlaf Hering <olaf@aepfle.de>
Thu, 26 May 2011 11:34:44 +0000 (12:34 +0100)
committerOlaf Hering <olaf@aepfle.de>
Thu, 26 May 2011 11:34:44 +0000 (12:34 +0100)
The start of the array which holds the list of mfns for each cpus
tracebuffer is stored in an unsigned short. This limits the total
amount of pages for each cpu as the number of active cpus increases.

Update the math in calculate_tbuf_size() to apply also this rule to
the max number of trace pages. Without this change the index can
overflow.

Signed-off-by: Olaf Hering <olaf@aepfle.de>
Acked-by: George Dunlap <george.dunlap@eu.citrix.com>
xen/common/trace.c

index b03ce5c38a9c786cfa2c037c807abebd8ac183c1..111deed3a5f040d2cf9c8cfdfadf5914f16ebe54 100644 (file)
@@ -112,11 +112,14 @@ static int calculate_tbuf_size(unsigned int pages, uint32_t t_info_first_offset)
     typeof(dummy_size.prod) max_size;
     struct t_info dummy_pages;
     typeof(dummy_pages.tbuf_size) max_pages;
+    typeof(dummy_pages.mfn_offset[0]) max_mfn_offset;
+    unsigned int max_cpus = num_online_cpus();
     unsigned int t_info_words;
 
     /* force maximum value for an unsigned type */
     max_size = -1;
     max_pages = -1;
+    max_mfn_offset = -1;
 
     /* max size holds up to n pages */
     max_size /= PAGE_SIZE;
@@ -124,6 +127,18 @@ static int calculate_tbuf_size(unsigned int pages, uint32_t t_info_first_offset)
     if ( max_size < max_pages )
         max_pages = max_size;
 
+    /*
+     * max mfn_offset holds up to n pages per cpu
+     * The array of mfns for the highest cpu can start at the maximum value
+     * mfn_offset can hold. So reduce the number of cpus and also the mfn_offset.
+     */
+    max_mfn_offset -= t_info_first_offset - 1;
+    max_cpus--;
+    if ( max_cpus )
+        max_mfn_offset /= max_cpus;
+    if ( max_mfn_offset < max_pages )
+        max_pages = max_mfn_offset;
+
     if ( pages > max_pages )
     {
         printk(XENLOG_INFO "xentrace: requested number of %u pages "